import csv
from collections import defaultdict
import math
import sys
import json
import io

# 设置标准输出编码为UTF-8，解决中文乱码问题
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')

# 1. 读文件，记录所有行
file_path = sys.argv[1] if len(sys.argv) > 1 else ''
frame_index = int(sys.argv[2]) if len(sys.argv) > 2 else 1  # 用户输入的Frame index编号
original_filename = sys.argv[3] if len(sys.argv) > 3 else ''  # 原始文件名

# 调试输出：显示接收到的参数
print(f"DEBUG: 接收到的文件路径: {file_path}")
print(f"DEBUG: 接收到的帧索引: {frame_index}")
print(f"DEBUG: 接收到的原始文件名: {original_filename}")

with open(file_path, newline='', encoding='utf-8-sig') as f:
    # 用 list 方便后续按索引切片
    lines = list(csv.reader(f))

# 2. 找到指定Frame index的数据范围
frame_start_line = -1
frame_end_line = len(lines)  # 默认到文件末尾

# 查找'Frame index: X'所在行
for idx, row in enumerate(lines):
    if row and len(row) > 0:
        cell_content = str(row[0]).strip()
        if cell_content == f'Frame index: {frame_index}':
            frame_start_line = idx
        elif cell_content == f'Frame index: {frame_index + 1}' and frame_start_line != -1:
            frame_end_line = idx
            break

if frame_start_line == -1:
    print(f'错误：未找到Frame index: {frame_index}')
    sys.exit(1)

print(f'处理Frame index: {frame_index}，数据范围：第{frame_start_line + 1}行到第{frame_end_line}行')

# 3. 在指定Frame范围内的A列中精确搜索Region 4到Region 10并提取数据
region_data = defaultdict(list)   # {4: [v1, v2, ...], 5: [...], ...}

# 在frame范围内搜索每个Region
for region_num in range(4, 11):  # Region 4到Region 10
    region_target = f'Region {region_num}'
    
    # 在frame范围内的A列（第0列）中搜索
    for idx in range(frame_start_line, frame_end_line):
        if idx < len(lines):
            row = lines[idx]
            if row and len(row) > 0:
                # 精确匹配A列中的"Region X"字符串
                cell_content = str(row[0]).strip()
                if cell_content == region_target:
                    print(f'找到{region_target}在第{idx + 1}行')
                    
                    # 向上64行获取数据块
                    data_start = max(0, idx - 64)  # 数据块起始行
                    data_end = idx  # 数据块结束行（不包含Region行本身）
                    
                    print(f'  数据块范围：第{data_start + 1}行到第{data_end}行')
                    
                    # 提取数据块中的所有非0和非-1的数值
                    for data_idx in range(data_start, data_end):
                        if data_idx < len(lines):
                            data_row = lines[data_idx]
                            for cell in data_row:
                                try:
                                    v = float(cell)
                                    if v != 0 and v != -1:
                                        region_data[region_num].append(v)
                                except ValueError:
                                    continue  # 空字符串或异常值直接跳过
                    
                    break  # 找到该Region后跳出循环，继续搜索下一个Region

# 4. 显示每个Region获取到的数据（用于调试）
print('\n=== 各Region提取的数据详情 ===')
for r in sorted(region_data):
    vals = region_data[r]
    print(f'Region {r}: 提取到 {len(vals)} 个有效数据点')
    if len(vals) > 0:
        # 显示所有数据点，不进行截断
        print(f'  数据: {vals}')
    else:
        print('  无有效数据')
    print()

# 5. 计算统计数据并准备结果
results = []
for r in sorted(region_data):
    vals = region_data[r]
    if len(vals) > 0:
        mean = sum(vals) / len(vals)  # 平均数
        # 计算标准差 (样本标准差，除以N-1)
        variance = sum((x - mean) ** 2 for x in vals) / (len(vals) - 1) if len(vals) > 1 else 0
        std_dev = math.sqrt(variance)
        # 计算离散系数 (CV = 标准差/平均数)
        cv = std_dev / mean if mean != 0 else float('inf')
        
        result_str = f'Region {r}: 有效点数={len(vals)}, 平均值={mean:.4f}, 标准差={std_dev:.4f}, 离散系数={cv:.4f}'
        print(result_str)
        
        results.append({
            'region': r,
            'valid_points': len(vals),
            'mean': round(mean, 4),
            'std_dev': round(std_dev, 4),
            'cv': round(cv, 4) if cv != float('inf') else 'inf'
        })
    else:
        print(f'Region {r}: 无有效数据点')
        results.append({
            'region': r,
            'valid_points': 0,
            'mean': 0,
            'std_dev': 0,
            'cv': 'inf'
        })

# 输出JSON格式结果，方便JavaScript解析
# 添加文件名信息到结果中
import os
# 使用原始文件名，如果没有提供则从文件路径提取
filename = original_filename if original_filename else os.path.basename(file_path)
print(f"DEBUG: 提取的文件名: {filename}")
final_result = {
    'filename': filename,
    'frame_index': frame_index,
    'results': results
}

print('\nJSON_RESULT_START')
print(json.dumps(final_result))
print('JSON_RESULT_END')